/*
 * @Author: NingJian
 * @Date: 2021-08-24 11:14:39
 * @LastEditTime: 2021-08-25 11:13:08
 * @LastEditors: NingJian
 * @Description: muse sdk
 * @FilePath: /musesdk/include/musesdk/musesdk.h
 * 
 */
#ifndef __MUSE_SDK_H__
#define __MUSE_SDK_H__

// muse sdk 使用流程
// 1. 连接muse设备
// 2. 加载模型到muse
// 3. 运行模型一次
// 4. 获取模型运行结果
// 5. 关闭连接

#include <string>

namespace musesdk
{

#ifdef _WIN32
#ifndef LIB_EXPORTS
#define LIB_EXPORTS __declspec(dllimport)
#else
#define LIB_EXPORTS __declspec(dllexport)
#endif
#else
#define LIB_EXPORTS
#endif

   /**
 * @description:  连接muse设备
 * @param {*}
 * @return {*} 
 */
   LIB_EXPORTS bool MuseConnect();

   /**
    * @description:  判断muse设配是否连接
    * @param {*}
    * @return {*}
    */
   LIB_EXPORTS bool MuseIsConnected();

   /**
 * @description: 
 * @param {string} model_path  模型目录路径
 * @param {bool} full 是否下发全部层
 * @param {int} layel 起始层，当 full = false 生效
 * @return {*}
 */
   LIB_EXPORTS bool MuseLoadModel(std::string model_path, bool full = true, int layel = 0);

   /**
 * @description: 运行推理
 * @param {uint8_t *} in_data  推理的输入数据
 * @param {size_t} len_data    输入数据长度
 * @return {*}
 */
   LIB_EXPORTS bool MuseRunPrediction(uint8_t *in_data, size_t len_data);

   /**
 * @description:  获取推理结果
 * @param {uint8_t *} out_data  推理结果数据
 * @param {size_t} &len_data    数据长度
 * @return {*}
 */
   LIB_EXPORTS bool MuseGetResult(uint8_t *out_data, size_t &len_data);

   /**
 * @description:  关闭muse
 * @param {*}
 * @return {*}
 */
   LIB_EXPORTS bool MuseDisconnect();

   /**
 * @description: 向muse中内存写入数据
 * @param {uint8_t *} in_data 数据
 * @param {size_t} write_len  数据长度
 * @param {size_t} addr       写入的地址
 * @return {*}
 */
   LIB_EXPORTS size_t MuseWriteMem(uint8_t *in_data, size_t write_len, size_t addr);

   /**
 * @description:  从muse内存读取数据
 * @param {uint8_t *} out_data  读取的数据
 * @param {size_t} read_len     读出的长度
 * @param {size_t} addr         起始地址
 * @return {*}
 */
   LIB_EXPORTS size_t MuseReadMem(uint8_t *out_data, size_t read_len, size_t addr);

   /**
 * @description:   向muse寄存器写入数据
 * @param {uint8_t *} in_data   数据内容
 * @param {size_t} write_len    数据长度
 * @param {size_t} addr         起始地址
 * @return {*}
 */
   LIB_EXPORTS size_t MuseWriteReg(uint8_t *in_data, size_t write_len, size_t addr);

   /**
 * @description:  存muse寄存器读取数据
 * @param {uint8_t *} out_data  数据输出
 * @param {size_t} read_len     读取的长度
 * @param {size_t} addr         起始地址
 * @return {*}
 */
   LIB_EXPORTS size_t MuseReadReg(uint8_t *out_data, size_t read_len, size_t addr);

}

#endif